﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using CppIDE.Core;
using Application = CppIDE.Core.Application;

namespace CppIDE.UI
{

    /// <summary>
    /// A fordítás során előforduló üzeneteket (fordítási napló) megjelenítő osztály.
    /// </summary>
    class BuildLog : ListBox
    {

        /// <summary>
        /// Konstruktor, létrehoz egy új példányt.
        /// </summary>
        public BuildLog()
        {
            Application.getInstance().ActiveProjectChange += new EventHandler(ActiveProjectChange);
        }

        /// <summary>
        /// Ha az aktuális projekt megváltozott, ez hívódik meg.
        /// Törli a tartalmát, ha nincs betöltve projekt.
        /// </summary>
        public void ActiveProjectChange(Object sender, EventArgs args)
        {
            if (!Application.getInstance().isProjectLoaded())
            {
                clear();
            }
        }

        /// <summary>
        /// Törli a napló tartalmát.
        /// </summary>
        public void clear()
        {
            Items.Clear();
        }

        /// <summary>
        /// Hozzáad egy szöveges sort a naplóhoz.
        /// </summary>
        /// <param name="line">a sor</param>
        public void addLine(String line)
        {
            Items.Add(line);
            scrollDown();
        }

        /// <summary>
        /// Hozzáad egy hibaüzenetet a naplóhoz.
        /// </summary>
        /// <param name="error">a hibaüzenet</param>
        public void addError(Error error)
        {
            Items.Add(error);
            scrollDown();
        }

        /// <summary>
        /// Legörgeti a naplót a legaljára.
        /// </summary>
        private void scrollDown()
        {
            SelectedIndex = Items.Count - 1;  
            SelectedIndex = -1;  
        }

        /// <summary>
        /// Ha kétszer rákattintanak egy elemre, és az egy olyan hibaüzenet
        /// volt, amihez van társítva hely, akkor megjelenítjük a problémás
        /// forrásfájlt, ha a sor száma is megvan, akkor kijelöljük azt a sort.
        /// </summary>
        /// <param name="e"></param>
        override protected void OnDoubleClick(EventArgs e)
        {
            if (SelectedItem == null) return;
            if (SelectedItem is CompileError)
            {
                CompileError error = SelectedItem as CompileError;
                if (error.Container == null) return;
                MainForm main = MainForm.getInstance();
                FileTabPage tabPage = main.open(error.Container);
                if (error.LineNumber != -1)
                {
                    tabPage.gotoLine(error.LineNumber);
                }
                tabPage.Focus();
            }
        }

    }

}
